#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
会话完成工具

供Agent调用的会话完成工具，用于在用户确认参数后标记会话完成
"""

from langchain.tools import BaseTool
from typing import Dict, Any, Optional, Type, Union
from pydantic import BaseModel, Field, validator
from loguru import logger
import json


class SessionCompletionInput(BaseModel):
    """会话完成工具的输入模型"""
    confirmed: Union[bool, str] = Field(True, description="用户是否确认参数")
    
    @validator('confirmed', pre=True)
    def parse_confirmed(cls, v):
        """解析确认状态，支持字符串和布尔值"""
        if isinstance(v, bool):
            return v
        elif isinstance(v, str):
            # 尝试解析 JSON 字符串
            try:
                parsed = json.loads(v)
                if isinstance(parsed, dict) and 'confirmed' in parsed:
                    return parsed['confirmed']
                elif isinstance(parsed, bool):
                    return parsed
                else:
                    # 处理字符串形式的布尔值
                    return v.lower() in ('true', '1', 'yes', 'confirmed')
            except (json.JSONDecodeError, TypeError):
                # 处理普通字符串
                return v.lower() in ('true', '1', 'yes', 'confirmed')
        else:
            return bool(v)


class SessionCompletionTool(BaseTool):
    """会话完成工具
    
    当用户确认参数后，调用此工具标记会话完成并设置确认状态
    """
    
    name: str = "mark_session_completed"
    description: str = """
    标记会话完成的工具。当用户确认推荐的参数时使用此工具。
    
    使用场景：
    - 用户说"确定"、"好的"、"没问题"、"可以"等确认词汇时
    - 用户同意推荐的参数配置时
    - 用户表示满意当前参数设置时
    
    调用此工具后，系统会：
    1. 标记会话为已完成状态
    2. 设置用户确认状态为True
    3. 自动生成JSON参数配置文件
    """
    args_schema: Type[BaseModel] = SessionCompletionInput
    agent_instance: Optional[Any] = Field(default=None, exclude=True)
    
    def __init__(self, agent_instance=None, **kwargs):
        super().__init__(**kwargs)
        object.__setattr__(self, 'agent_instance', agent_instance)
    
    def _run(self, confirmed: Union[bool, str] = True, **kwargs) -> str:
        """执行会话完成操作
        
        Args:
            confirmed: 用户确认状态（支持布尔值或字符串）
        Returns:
            str: 操作结果描述
        """
        try:
            if not self.agent_instance:
                return "错误：未设置代理实例"
            
            # 确保 confirmed 是布尔值
            if isinstance(confirmed, str):
                try:
                    parsed = json.loads(confirmed)
                    if isinstance(parsed, dict) and 'confirmed' in parsed:
                        confirmed = parsed['confirmed']
                    else:
                        confirmed = confirmed.lower() in ('true', '1', 'yes', 'confirmed')
                except (json.JSONDecodeError, TypeError):
                    confirmed = confirmed.lower() in ('true', '1', 'yes', 'confirmed')
            
            logger.info(f"接收到会话完成请求，用户确认状态: {confirmed}")
            
            if confirmed:
                # 标记会话完成
                self.agent_instance.mark_session_completed()
                
                result = "会话已标记为完成，用户确认状态已设置。系统将自动生成JSON参数配置。"
                logger.info("会话完成工具执行成功")
                return result
            else:
                result = "用户未确认参数，会话继续进行。"
                logger.info("用户未确认，会话继续")
                return result
                
        except Exception as e:
            logger.error(f"会话完成工具执行失败: {e}")
            return f"会话完成操作失败: {str(e)}"
    
    async def _arun(self, **kwargs) -> str:
        """异步执行会话完成操作"""
        return self._run(**kwargs)